package com.project.restaurant.common.api;

/**
 * 常用API响应码
 * 常用的已经固定定义的响应码：
 * 200 OK：客户端请求成功，表示请求已成功，请求所希望的响应头或数据体将随此响应返回。
 * 302 (临时重定向) :表示请求的资源临时搬到了其他位置请求的资源暂时被配到到了新的URI
 * 304 (未修改) : 表示客户端发送附带条件的请求（GET方法请求报文中的IF…）时，条件不满足返回304时，不包含任何响应主体
 * 400 Bad Request：客户端请求有语法错误，不能被服务器所理解。
 * 401 Unauthorized：请求未经授权，请求要求身份验证。对于需要登录的网页，服务器可能返回此响应。
 * 403 Forbidden：服务器收到请求，但是拒绝提供服务。
 * 404 Not Found：请求资源不存在，服务器无法根据客户端的请求找到资源，前端调用的URL不存在。
 * 500 Internal Server Error：服务器发生不可预期的错误，一般来说，这个问题都会在服务器程序出错时出现，即后端问题。
 * 502 bad gateway：错误网关，由于连接超时，向服务器发送请求，由于服务器当前链接太多，导致服务器方面无法给出正常的响应。
 * 503 Server Unavailable：服务器当前不能处理客户端的请求，一段时间后可能恢复正常。
 * 504 ：网关超时，服务器作为网关或代理，未及时从上游服务器接收请求。
 * 其他api响应码规范：
 * 1xx ： 服务器接收到请求，需要请求者继续操作
 * 2xx ：操作已成功接收并处理
 * 3xx ：重定向响应码,需要进一步操作完成请求
 * 4xx ：客户端（前端）错误响应码，请求包含语法错误或者不规范而导致无法完成请求处理
 * 5xx ：服务器（后的）错误响应码，服务器:处理请求过程中发生错误
 */
public enum ServiceStateCode implements StateCode{
    /*===========================||     1xx      ||===================================*/

    /*===========================|| 成功处理器状态码 ||===================================*/
    SUCCESS(200,"业务正确执行"),
    ORDER_PAY_ALREADY_TIMEOUT(201,"订单已经过时或不存在"),
    //===========================||   重定向状态码  ||===================================*/

    /*===========================|| 客户端错误状态码 ||===================================*/
    DISABLE_MALICIOUS_REQUEST(400,"禁止恶意请求"),

    PARAMETER_NONSTANDARD(405,"参数不规范"),
    IRREGULAR_ACCESS(406,"访问不规范"),
    LOGIN_AFTER_OPERATION(407,"登录后才可以操作"),
    USERNAME_IS_EMPTY(408,"用户名为空"),
    NO_MATCH_USER(409,"账户不存在或者密码错误"),
    NO_EXIST_USER(410,"用户不存在"),
    FAIL_TO_REGISTER(418,"注册失败"),
    NO_EXIST_EMAIL(411,"邮箱不存在"),
    EXIST_USER(412,"用户已存在"),
    EXIST_EMAIL(413,"邮箱已被绑定"),
    AUTH_CODE_TIMEOUT(416,"验证码已经过时"),
    AUTH_CODE_NO_MATCH(417,"验证码不匹配"),
    EMAIL_ALREADY_SEND(480,"验证码已经发送到邮箱"),

    /*===========================||  服务错误状态码  ||===================================*/
    FAILURE(500,"服务器出错了"),
    SEND_FAILURE(501,"发送失败"),
    WXPAY_FAILURE(502,"微信支付请求失败"),
    FAILED_UPLOAD(503,"上传失败"),
    FAILED_UPDATE(504,"修改失败"),
    NOT_EXIST_PAY_ORDER(505,"不存在支付订单"),
    NOT_EXIST_MEAL(506,"不存在对应的餐点"),
    INVENTORY_LACK(507,"库存不足"),
    ;

    /**
     * 服务状态码
     */
    private int code;
    /**
     * 状态码描述信息
     */
    private String message;

    ServiceStateCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public static ServiceStateCode getServiceStateCode(int code) throws Exception {

        ServiceStateCode[] values = ServiceStateCode.values();
        for(ServiceStateCode i:values){
            if(i.getCode() == code){
                return i;
            }
        }
        throw new Exception(String.format("不存在%s,对于的服务状态码", code));
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }


    public void setCode(int code) {
        this.code = code;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public boolean equal(StateCode code){
        return (code != null && code.getCode() == this.getCode()) ? true : false;
    }


}
